#include "IWDG_Config.h"

/**
    ******************************************************************************
    * @函数名称：Reset_Status
    * @功能描述：检测并清除系统复位标志，通过串口上报复位原因
    * @输入参数：无
    * @返回值：无
    * @详细说明：
    *   1. 检测顺序按复位严重程度排列：IWDG > WWDG > PIN > SOFT
    *   2. 每次检测到复位标志后会立即清除该标志
    *   3. 通过USART1发送复位类型信息（115200bps）
    * @硬件要求：
    *   1. 需提前初始化USART1外设
    *   2. 需使能RCC时钟控制模块
    ******************************************************************************
    */
void Reset_Status(void)
{
    USART_SendString(USART1, "\r\n");

    /* 独立看门狗复位检测（最高优先级） */
    if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)){
        USART_SendString(USART1, "IWDG Reset\r\n");  // 看门狗超时复位
        RCC_ClearFlag();  // 清除复位标志
    }
    /* 硬件引脚复位检测 */
    else if(RCC_GetFlagStatus(RCC_FLAG_PINRST)){
        USART_SendString(USART1, "PIN Reset\r\n");   // NRST引脚触发复位
        RCC_ClearFlag();
    }
    /* 软件复位检测 */
    else if(RCC_GetFlagStatus(RCC_FLAG_SFTRST)){
        USART_SendString(USART1, "SFTRST Reset\r\n"); // 通过软件指令触发复位
        RCC_ClearFlag();
    }
    /* 窗口看门狗复位检测 */
    else if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)){
        USART_SendString(USART1, "WWDGRST Reset\r\n"); // 窗口看门狗超时
        RCC_ClearFlag();
    }
}

/**
    ******************************************************************************
    * @函数名称：Iwdg_Config
    * @功能描述：独立看门狗初始化配置（直接寄存器操作版本）
    * @输入参数：无  
    * @返回值：无
    * @详细说明：
    *   1. 配置流程：解锁→设置预分频→设置重载值→启动
    *   2. 当前配置：PR=5(256分频), RLR=1000
    *       LSI=40kHz时，超时时间 = (1000+1)*(256/40kHz) ≈ 6.4秒
    *   3. 喂狗操作需在超时前通过Iwdg_Relod()完成
    * @硬件要求：
    *   1. 需确保LSI时钟已启用（默认上电启用）
    *   2. 配置后无法修改参数，除非硬件复位
    ******************************************************************************
    */
void Iwdg_Config(void)
{
    IWDG->KR = 0x5555;  // 解锁PR/RLR寄存器（写入密钥）
    IWDG->PR = 5;       // 设置预分频系数为256（0b101）
    IWDG->RLR = 2000;   // 设置重载值为1000
    IWDG->KR = 0xAAAA;  // 重载计数器（喂狗）
    IWDG->KR = 0xCCCC;  // 启动看门狗（不可逆操作）
}

/**
    ******************************************************************************
    * @函数名称：Iwdg_Relod
    * @功能描述：重载独立看门狗计数器（喂狗操作）
    * @输入参数：无  
    * @返回值：无
    * @详细说明：
    *   1. 必须定期调用（间隔小于6.4秒）
    *   2. 实质是向KR寄存器写入0xAAAA
    *   3. 可在中断/主循环中调用
    * @硬件要求：
    *   1. 需先完成Iwdg_Config()初始化
    ******************************************************************************
    */
void Iwdg_Relod(void)
{
    IWDG_ReloadCounter();  // 标准库函数，等效于IWDG->KR = 0xAAAA
}

/* 备选配置方案（使用标准库函数） 
void Iwdg_Config(void)
{
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  // 解锁配置
    IWDG_SetPrescaler(IWDG_Prescaler_128);         // 128分频
    IWDG_SetReload(1000);                          // 重载值1000
    IWDG_ReloadCounter();                          // 初始喂狗
    IWDG_Enable();                                 // 启动看门狗
}
*/
